// 将获取到的数据存到excel中
const writeExcel = require('./util/node-create-excel')
// 从 selenium-webdriver 包中导入相关依赖
const {
    Builder,
    By,
    Key,
    until
} = require('selenium-webdriver');

// 存放职位信息
let jobList = []
// 定义初始页码
let currentTag = 1;
// 定义最大页码
let maxTag;
// 实例化 Chrome 浏览器
let driver = new Builder().forBrowser('chrome').build();

// 声明一个自执行方法
(async function example() {
    // 打开拉钩官网
    await driver.get('https://www.lagou.com/');
    // 勾选上海站
    await driver.findElement(By.css("div#changeCityBox ul.clearfix li:nth-child(2)")).click()
    // 搜索前端并回车
    await driver.findElement(By.id('search_input')).sendKeys('前端', Key.RETURN);
    // 获取最大页码
    maxTag = await driver.findElement(By.css("div.page-number>.totalNum")).getText()
    // 执行爬取方法
    start()
})();

// 将爬取方法抽离出来
async function start() {
    // 只有正确时才打印
    console.log(`------当前正在获取第${currentTag}页的数据，共${maxTag}页------`);
    while (true) {
        // 每次进来先声明本次循环没有错误，没有错误则会退出 while 循环，不会陷入死循环
        let netError = true
        try {
            // 获取到职位列表集合
            let items = await driver.findElements(By.css("div#s_position_list>ul.item_con_list li"))
            // 遍历每个职位，获取职位的详细信息
            for (let i = 0; i < items.length; i++) {
                let item = items[i]
                // 获取职位名称
                let jobName = await item.findElement(By.css(".position>.p_top>a>h3")).getText()
                // 获取工作地址
                let jobAddress = await item.findElement(By.css(".position>.p_top>a>span>em")).getText()
                // 获取职位链接
                let positionLink = await item.findElement(By.css(".position>.p_top>a")).getAttribute('href')
                // 获取职位发布时间
                let formatTime = await item.findElement(By.css(".position>.p_top>.format-time")).getText()
                // 职位薪资
                let money = await item.findElement(By.css(".position>.p_bot>.li_b_l>.money")).getText()
                // 职位要求
                let requirement = await item.findElement(By.css(".position>.p_bot>.li_b_l")).getText()
                // 由于要求没有标签包裹，所以需要替换一下
                requirement = requirement.replace(money, "")
                // 获取工作内容
                let jobContent = await item.findElement(By.css("div.list_item_bot>.li_b_l")).getText()
                // 获取公司福利
                let jobwelfare = await item.findElement(By.css("div.list_item_bot>.li_b_r")).getText()
                // 获取公司名称
                let companyname = await item.findElement(By.css("div.company>div.company_name>a")).getText()
                // 获取公司网址
                let companylink = await item.findElement(By.css("div.company>div.company_name>a")).getAttribute('href')
                // 获取公司规模
                let industry = await item.findElement(By.css("div.company>.industry")).getText()

                jobList.push({
                    jobName,
                    jobAddress,
                    positionLink,
                    formatTime,
                    money,
                    requirement,
                    jobContent,
                    jobwelfare,
                    companyname,
                    companylink,
                    industry
                })
            }
            // 爬取完第一页后让当前页码加1
            currentTag++
            // 如果当亲的页码小于等于最大页码，则说明没有爬取结束继续爬下一页数据
            if (currentTag <= 1) {
                // 执行点击下一页的操作
                await driver.findElement(By.css(".item_con_pager>.pager_container>.pager_next")).click()
                // 递归执行爬取方法
                await start()
            } else {
                // 保存爬取到的数据信息到TXT文件中
                // fs.writeFile('./bin/joblist.txt', JSON.stringify(jobList), (err, data) => {
                //     console.log('数据获取完毕');
                // })
                writeExcel(jobList)
            }
        } catch (error) {
            // 如果有错误，则让循环状态变成 false ，继续下一次循环
            if (error) netError = false
        } finally {
            // finally 表示无论对错都会执行
            // 每次循环的时候就来判断对错，如果没有错误则 break 退出 while 循环
            if (netError) break;
        }
    }
}